package uniandes.cupi2.messengerAmigos.cliente;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.ArrayList;

import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;

import uniandes.cupi2.messengerAmigos.interfazCliente.VentanaConversacionGrupo;

public class ThreadRecepcionMensajes extends Thread
{
    private int id;
    IClienteMessenger mundo;
    VentanaConversacionGrupo ventana;
    String nombreGrupo;
    MulticastSocket multicastSocket;
    InetAddress inetAddress;

    public ThreadRecepcionMensajes( IClienteMessenger mundo, int id, VentanaConversacionGrupo ventana, String nombreGrupo )
    {
        this.mundo = mundo;
        this.id = id;
        this.ventana = ventana;
        try
        {
            multicastSocket = new MulticastSocket( 7777 );
            String dirr = "230.0.0." + id;
            inetAddress = InetAddress.getByName( dirr );
            multicastSocket.joinGroup( inetAddress );
        }
        catch( IOException e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace( );
        }
    }

    public void run( )
    {
        try
        {
            while( true )
            {
                byte[] arb = new byte[Grupo.SIZE];
                DatagramPacket datagramPacket = new DatagramPacket( arb, arb.length );
                multicastSocket.receive( datagramPacket );
                String pa = new String( arb );
                if( pa.startsWith( "ARCHIVO" ) )
                {
                    recivirArchivo( pa.split( ":" )[ 1 ] );
                }
                else
                {
                    mostrarMense( pa.split( ";" )[ 0 ] );
                }

            }
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
    }
    private void recivirArchivo( String string )
    {
        try
        {
            ArrayList<Integer> recibidos = new ArrayList<Integer>( );
            BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( "./archivos/" + string + System.currentTimeMillis( ) ) );
            while( true )
            {
                byte[] arb = new byte[Grupo.SIZE];
                DatagramPacket datagramPacket = new DatagramPacket( arb, arb.length );
                multicastSocket.receive( datagramPacket );
                byte[] ar = new byte[2];
                ar[ 1 ] = arb[ Grupo.SIZE - 1 ];
                ar[ 0 ] = arb[ Grupo.SIZE - 2 ];
                try
                {
                    int numeroPaquete = Integer.parseInt( new String( ar ) );
                    recibidos.add( numeroPaquete );
                }
                catch( Exception e )
                {

                }
                System.out.println( " R: " + new String( ar ) );
                String pa = new String( arb );
                if( pa.startsWith( "FIN_ARCHIVO" ) )
                {
                    System.out.println( "fin" );
                    // bos.write( arb, 0, Grupo.SIZE - 2 );
                    bos.close( );
                    if( paqueteCorrecto( recibidos ) )
                    {
                        System.out.println( "paquete OK" );
                        mostrarMense( "Archivo recibido" );
                        return;
                    }
                    else
                    {
                        mostrarMense( "Archivo recibido con ERRORES" );
                        bos.close( );
                        corregirPaquete( );
                    }
                }
                // -----
                bos.write( arb, 0, Grupo.SIZE - 2 );
                arb = new byte[Grupo.SIZE];
                // -----
                Thread.sleep( 100 );
            }
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
        catch( InterruptedException e )
        {
            e.printStackTrace( );
        }
    }

    private void corregirPaquete( )
    {
        // TODO Auto-generated method stub

    }

    private boolean paqueteCorrecto( ArrayList<Integer> recibidos )
    {
        ArrayList<Integer> r = ( ArrayList<Integer> )recibidos.clone( );
        for( int i = 0; i < recibidos.size( ); i++ )
        {
            if( recibidos.contains( i + 1 ) )
                r.remove( new Integer( i + 1 ) );
        }
        return r.size( ) == 0;
    }

    public void mostrarMense( String mensaje )
    {
        ventana.setVisible( true );
        ventana.publicarMensaje( mensaje );
    }
}
